ホームに戻る
出典 :
関連 :
目次 :
Plain Old Data (POD)とは
C言語の構造体、または共用体と互換性のある オブジェクトレイアウト(型)のこと。
データが宣言通りの順序で並ぶことが保証されるため、C言語とのデータ共有に用いることができ、memcpy() 、memset() でコピー、初期化できる。
PODである条件
C++03
- aggregate である
- ユーザ定義のコンストラクタを持たない
- 基底クラスを持たない (派生クラスではない)
- static でない private / protected な データメンバ を持たない ( = 非静的メンバがいずれも public )
- virtual なメンバ関数(仮想関数)を持たない
- ユーザ定義のデストラクタを持たない
- ユーザ定義の operator = を持たない
- staticでない non-POD型の構造体・共用体(とその配列)をメンバを持たない
- staticでない 参照 を持たない
C++11
C++11(以降)では条件がC++03よりも緩和されている。
- trivial である
- デフォルトコンストラクタを持ち、かつ、非 trivial なデフォルトコンストラクタを持たない
- 非 trivial なコピーコンストラクタを持たない
- 非 trivial なムーブコンストラクタを持たない
- 非 trivial なコピー代入演算子を持たない
- 非 trivial なムーブ代入演算子を持たない
- trivial なデストラクタを持つ
- standard-layout である
- 全ての非静的データメンバが standard-layout 型である
- 全ての非静的データメンバに、同じアクセス制御 (public / private / protected) がかかっている( = 混在していない)
- 仮想関数を持たない
- 仮想基底クラスを持たない
- 全ての基底クラスが standard-layout 型である
- 一つ目に定義された非静的データメンバと同じ型の基底クラスを持たない
- 非静的データメンバを持つ基底クラスを持たない。もしくは、導出クラスが非静的データメンバを持たず、高々一つの基底クラスしか非静的データメンバを持たない。これはつまり、クラス階層において非静的データメンバを持ってよいクラスは一つだけである、ということである
ここで、コンストラクタ、デストラクタ、演算子が trivial である、とは
- ユーザ定義 (user-provided) ではない
- (デストラクタのみ) virtual ではない
を意味する。
C++03ではすべての非静的 (non-static) メンバが public である必要があるが、C++11では public / private / protected のいずれか一つに統一されていればよい。
POD型であることのチェック (C++11以降)
std::is_pod<> を用いることで確認できる。
#include <type_traits>
// POD型
class C_Hoge
{
:
};
// non-POD型
class C_Fuga
{
// non-trivial なデフォルトコンストラクタ
C_Fuga() {}
};
void main()
{
std::cout << std::boolalpha; //< bool を英字で出力
std::cout << std::is_pod<C_Hoge>::value << '\n';
std::cout << std::is_pod<C_Fuga>::value << '\n';
}
実行結果
true
false